import html2Canvas from "html2canvas";
import jsPDF from "jspdf";

// 定义参数类型
interface PdfOptions {
  title: string; // PDF 文件标题
  ids: string[]; // DOM 元素的选择器数组
  direction: "portrait" | "landscape"; // 页面方向
  printBackground?: boolean;
}

const htmlToPdf = {
  getPdf({ title, ids, direction, printBackground = false }: PdfOptions) {
    // 创建 jsPDF 实例，根据方向设置页面
    const pdf = new jsPDF(direction as "portrait" | "landscape", "mm", "a4");
    const a4w = direction === "landscape" ? 277 : 190; // A4 纸张宽度
    const a4h = direction === "landscape" ? 190 : 277; // A4 纸张高度

    // 遍历每个 id 并渲染到 PDF
    ids.forEach((id, index) => {
      // 1. 构建 DOM 树
      const pdfContent = document.querySelector<HTMLElement>(id); // 明确指定类型为 HTMLElement
      if (!pdfContent) {
        console.error(`未找到匹配的选择器: ${id}`);
        return;
      }

      // 确保 pdfContent 是 HTMLElement 类型
      if (!(pdfContent instanceof HTMLElement)) {
        console.error(`选择器 ${id} 匹配到的不是 HTMLElement`);
        return;
      }

      // 临时显示 printData 元素
      pdfContent.style.display = "block";

      // 设置临时视口尺寸
      const ownerDocument = pdfContent.ownerDocument;
      if (ownerDocument && ownerDocument.defaultView) {
        ownerDocument.defaultView.innerWidth = 1000;
        ownerDocument.defaultView.innerHeight = 1000;
      } else {
        console.warn("无法访问 ownerDocument.defaultView，可能会影响渲染效果");
      }

      // 2. Canvas 渲染图像
      html2Canvas(pdfContent, {
        logging: false,
        useCORS: true,
        scale: 2, // 按比例增加分辨率
        allowTaint: !printBackground, // 使用 printBackground 控制背景渲染
      }).then((canvas) => {
        // 3. jsPDF 导出 pdf 文件
        const imgData = canvas.toDataURL("image/jpeg", 1.0);

        // 手动计算分页
        const pageHeight = a4h * 25.4; // A4 高度（毫米）转换为像素
        const imgHeight = canvas.height;
        const imgWidth = canvas.width;

        let position = 0;
        const imgHeightInPdf = (imgHeight * a4w) / imgWidth;

        while (position < imgHeight) {
          pdf.addImage(
            imgData,
            "JPEG",
            10,
            position ? 10 : 10,
            a4w,
            imgHeightInPdf > pageHeight ? pageHeight : imgHeightInPdf
          );

          position += pageHeight;
          if (position < imgHeight) {
            pdf.addPage();
          }
        }

        // 如果不是最后一个元素，添加新页面
        if (index < ids.length - 1) {
          pdf.addPage();
        }

        // 隐藏 printData 元素
        pdfContent.style.display = "none";

        // 如果是最后一个元素，保存 PDF
        if (index === ids.length - 1) {
          pdf.save(`${title}.pdf`);
        }
      });
    });
  },
};

export default htmlToPdf;
